{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# AI达人创造营第二期\n",
    "## 一、项目背景介绍\n",
    "社会经济不断发展的同时，作为国民经济基础之一的道路交通系统亦日益发达，随之而来的是交通安全问题的日趋凸显。2019 年全国共发生交通事故 20 万余次，分析事故原因主要包括有违规驾驶、雨雪雾等恶劣天气、疲劳驾驶、接听手机等，其中诸如不遵守交通标志指示的违规驾驶行为是导致交通事故的最主要原因。如何从客观的角度为车辆设置有效的行车辅助系统以约束驾驶人主观驾车行为，在这一问题背景下，交通标志识别 （Traffic Sign Recognition，TSR） 系统研究成为一大研究热点，有效的 TSR 系统能够及时地将真实、准确的实时交通信息反馈给驾驶人，提示驾车人采取相应措施或车辆自主控制达到避险目的，从而保障行车安全。TSR 系统是智能交通和自动驾驶研究领域中的一项关键性技术，其主要应用价值表现在以下几个方面：\n",
    "（1） 作为智能交通系统的子系统，用于处理车载摄像与传感器采集到的车辆周边实时的图像与视频，并从中检测交通标志，再进行识别，将识别信息反馈给司机，帮助其决策、辅助驾驶。\n",
    "（2） 作为自动驾驶控制系统中必要的组件，实时的交通标志识别可不间断的为整车控制提供相应的帮助。例如：识别结果为禁止标志可提交系统并预判危险；警告标志可协助系统提前进行避障；指示标志可帮助系统进行控制预处理，提前进行路线规划，确保车辆遵循交通指示。\n",
    "（3） 用于智能导航系统：将交通标志识别结果上传至导航系统中，进行数据比较，结合地图信息、车辆定位以及实时交通信息，以纠正导航路线偏差。\n",
    "（4） 用于交通标志的维护：受环境影响，交通标志常出现褪色、变形等问题，应用 TSR 技术，可监控相应路段交通标志的可用性，减少人力与时间的投入。\n",
    "人工智能时代带来的技术红利，加之 5G 技术的落地与普及，TSR 系统的应用将不再是“纸上谈兵”。\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/9ac01657c5334e0c99a6f41a81c3a046a2e93cbd953541868e821ce8d20105a4)\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/ff9c61c9de084822acf97286af253786dfa60f06278640a3930708acb54f9c7b)\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/7600ad7de6584f3eb7c040930dbb4aba511510af26f046cf9f61fbc389598180)\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/3466c1d8156f404ba22840bbb239771f80c1e16fb36048d5a9b7824931f19839)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 二、数据介绍\n",
    "该数据集源自中国交通标志识别数据库。里加数据科学俱乐部成员已经探索了它，以便对卷积神经网络进行一些培训。\n",
    "\n",
    "数据集由 58 个类别的 5998 张交通标志图像组成。每个图像都是单个交通标志的放大视图。注释提供图像属性（文件名、宽度、高度）以及图像和类别中的交通标志坐标（例如，限速 5 公里/小时）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 三、模型介绍\n",
    "MobileNetV3是在MobileNetV2的基础上提出的网络，其计算量小、参数少，相比其他轻量级网络，依然取得了较好的成绩；同时以ResNeXt101_32x16d_wsl为teacher模型，运用SSLD（简单的半监督标签知识蒸馏）方式蒸馏出MobileNetV3_large模型，作为预训练模型；相对比原有的MobileNetV3预训练模型，在参数量不变的情况下，MobileNetV3_ssld预训练模型在ImageNet数据集上的精度提升3%，有助于用户进一步提升在自定义数据集上模型训练的效果。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 四、模型训练\n",
    "训练模型参数：\n",
    "\n",
    "num_epochs=10,\n",
    "train_batch_size=32,\n",
    "lr_decay_epochs=[4, 6, 8],\n",
    "save_interval_epochs=1,\n",
    "learning_rate=0.025,"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 五、模型评估![](https://ai-studio-static-online.cdn.bcebos.com/a0f800570cca412e8e6efaf815429f2fd0785fa7ebea47b0b592b9a221cfbaa8)\n",
    "\n",
    "这是用其中几十张图片选出的小数据集，分为两类牌子分别为15和5作出的模型评估"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 六、总结与升华\n",
    "本项目旨在做到稳定性更高，准确率更高，识别速度更快的交通标志识别辅助系统，对驾驶人进行实时辅助提醒。目前还并不能达到这个标准。但会继续努力。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 七、个人总结\n",
    "通过几周的飞桨创造营的学习，我学到了从零开始到实际应用部署的整个深度学习图像文本分类等项目的流程，很有收获，谢谢飞桨提供的课程活动"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#安装依赖\r\n",
    "! pip install paddlex==2.0.0rc4 -i https://mirror.baidu.com/pypi/simple"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import paddlex as pdx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#解压数据集\r\n",
    "!unzip -oq /home/aistudio/data/data107275/archive'(5)'.zip -d work/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#查看目录结构\r\n",
    "!tree work/ -d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#数据处理\r\n",
    "from paddlex import transforms as T\r\n",
    "\r\n",
    "train_transforms = T.Compose(\r\n",
    "    [T.RandomCrop(crop_size=224), T.RandomHorizontalFlip(), T.Normalize()])\r\n",
    "\r\n",
    "eval_transforms = T.Compose([\r\n",
    "    T.ResizeByShort(short_size=256), T.CenterCrop(crop_size=224), T.Normalize()\r\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#定义训练和验证数据集\r\n",
    "train_dataset = pdx.datasets.ImageNet(\r\n",
    "    data_dir='work/archive'(5)'',\r\n",
    "    file_list='work/archive'(5)'/train_list.txt',\r\n",
    "    label_list='work/archive'(5)'/labels.txt',\r\n",
    "    transforms=train_transforms,\r\n",
    "    shuffle=True)\r\n",
    "eval_dataset = pdx.datasets.ImageNet(\r\n",
    "    data_dir='work/archive'(5)'',\r\n",
    "    file_list='work/archive'(5)'/val_list.txt',\r\n",
    "    label_list='work/archive'(5)'/labels.txt',\r\n",
    "    transforms=eval_transforms)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#设置训练参数\r\n",
    "num_classes = len(train_dataset.labels)\r\n",
    "model = pdx.cls.MobileNetV2(num_classes=num_classes)\r\n",
    "model.train(num_epochs=10,\r\n",
    "            train_dataset=train_dataset,\r\n",
    "            train_batch_size=32,\r\n",
    "            eval_dataset=eval_dataset,\r\n",
    "            lr_decay_epochs=[4, 6, 8],\r\n",
    "            save_interval_epochs=1,\r\n",
    "            learning_rate=0.025,\r\n",
    "            save_dir='output/mobilenetv2',\r\n",
    "            use_vdl=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#预测\r\n",
    "import paddlex as pdx\r\n",
    "model = pdx.load_model('output/mobilenetv2/best_model')\r\n",
    "image_name = 'work/archive'(5)'/000_1_0017.png'\r\n",
    "result = model.predict(image_name)\r\n",
    "print(\"Predict Result:\", result)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "py35-paddle1.2.0"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
